package rootpackege.spring.controller.websocket;

import java.security.Principal;

import javax.management.Notification;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.messaging.simp.annotation.SendToUser;
import org.springframework.messaging.simp.annotation.SubscribeMapping;
import org.springframework.stereotype.Controller;
/**
 * 获取不经过消息代理的客户端消息  根据配置，如果路径是以app开头的话 会访问到
 * 此控制器下对应的方法 如 “/app/firstMsg”
 * @author BriansPC
 *
 */
@Controller
public class STOMPWebsocketController {
	/**
	 * 当stomp请求"/app/firstMsg"时，该方法回执行
	 * 返回结果会发送到"/topic/responseMsg"主题，凡是订阅了该主题的客户端
	 * 都能收到该消息
	 * @param msg
	 * @return
	 */
	@MessageMapping("/firstMsg")
	@SendTo("/topic/responseMsg")
	public String receiveMessage(ReceiveMessage msg){
		System.out.println("收到客户端发送来的消息"+msg.getMsg());
		return "xiangying。。。。";
	}
	/**
	 * 该方法绑定了subMsg通道，请求响应类似与http
	 * @return
	 */
	@SubscribeMapping("/subMsg")
	public String receive2send(){
		System.out.println("收到客户端发送来的消息");
		return "服务端相应消息";
	}
	
	@Autowired
	STOMPWebsocketService sTOMPWebsocketService;
	/**
	 * service层通过注入SimpMessagingTemplate，实现任意位置向主题中发送消息
	 */
	@MessageMapping("/secondMsg")
	public void sendMsgTenTimes(ReceiveMessage msg){
		System.out.println("收到客户端发送来的消息"+msg.getMsg());
		for(int i = 0 ; i < 10 ; i++ ){
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			sTOMPWebsocketService.sendMsg2Client(""+i);
		}
		
	}
	
	//上面订阅主题都存在一个问题 ，那就是当多个客户端都订阅了同一个主题时，无法将响应消息发送到某一个客户端处！
	//******************************************************************************************
	//下面的方法  用于发送消息到指定的客户端  实现方式不同但效果一样 ————前提是需要登录，Principal在登录之后才能获取到用户数据，登录使用的是springsecurity
	
	/**
	 * 通过@SendToUser注解 将消息返回给指定用户--前提是已经登录
	 * @param principal 当用户登录之后 principal里面存放的是用户信息
	 * @param msg
	 */
	@MessageMapping("/msg2UserbyAnnotation")
	@SendToUser("/queue/userNoti")
	public String sendMsg2UserbyAnnotation(Principal principal ,ReceiveMessage msg){
		System.out.println("收到客户端发送来的消息"+msg.getMsg());
		
		sTOMPWebsocketService.sendMsg2User(principal," end");
		return "服务端相应消息  to  "+ principal.getName();
		
	}
	
	/**
	 * SimpMessagingTemplate.convertAndSendToUser()方法  将消息返回给指定用户
	 * @param principal
	 * @param msg
	 */
	@MessageMapping("/msg2UserbySimpMessagingTemplate")
	public void sendMsg2UserbySimpMessagingTemplate(Principal principal ,ReceiveMessage msg){
		System.out.println("收到客户端发送来的消息"+msg.getMsg());
		
		sTOMPWebsocketService.sendMsg2User(principal," end");
		
	}
	
}
